package net.xiaosaguo.mymall.auth.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import net.xiaosaguo.common.pojo.vo.MemberVO;
import net.xiaosaguo.common.utils.HttpUtils;
import net.xiaosaguo.common.utils.R;
import net.xiaosaguo.mymall.auth.feign.MemberFeignService;
import net.xiaosaguo.mymall.auth.vo.WeiboSocialUser;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.Map;

/**
 * description: 社交登录请求 OAuth 授权
 *
 * @author xiaosaguo
 * @date 2020/07/06
 */
@Controller
public class OAuth2Controller {

    @Autowired
    MemberFeignService memberFeignService;

    @GetMapping("/oauth2.0/weibo/success")
    public String weibo(@RequestParam String code, HttpSession session, HttpServletRequest request, HttpServletResponse httpResponse) throws Exception {

        /*
         * 获取原生 session,使用 HttpServletResponse.getSession()
         * 下面的 session1 和 形参中注入的 session 是同一个
         */
        HttpSession session1 = request.getSession();

        // 1. 根据 code 换取 accessToken
        Map<String, String> map = new HashMap<>();
        map.put("client_id", "1122451799");
        map.put("client_secret", "81fcfb89cf9d0f2630d49c4cb0e41bfb");
        map.put("grant_type", "authorization_code");
        map.put("redirect_uri", "http://auth.mymall.com/oauth2.0/weibo/success");
        map.put("code", code);
        HttpResponse response = HttpUtils.doPost("https://api.weibo.com", "/oauth2/access_token", "post",
                new HashMap<>(0), null, map);

        // 2. 登录处理
        if (response.getStatusLine().getStatusCode() == HttpStatus.OK.value()) {
            // 获取 access_token
            String entityStr = EntityUtils.toString(response.getEntity());
            WeiboSocialUser user = JSON.parseObject(entityStr, WeiboSocialUser.class);
            // System.out.println(user);
            // 知道当前是哪个社交用户了
            // 1. 如果当前用户是第一次进网站，就自动注册进来（为当前社交用户生成一个会员信息账号，以后这个社交账号就对应这定的用户）
            // 登录或者注册这个社交用户
            R r = memberFeignService.oauth2Login(user);
            if (r.getCode() == 0) {
                MemberVO member = r.getData(new TypeReference<>() {
                });
                System.out.println("登录成功，用户信息：" + member);
                /* 第一次使用 session：命令浏览器在 cookie 中保存 JSESSIONID
                 * 以后浏览器访问那个网站就会带上这个网站的 cookie
                 * 解决子域间 session 共享（mymall.com/auth.mymall.com）
                 * 第一次设置 session 的时候，即时是子域系统设置的，也要能让父域直接使用，即放大作用域，手动指定为父域名
                 */
                // 1.解决子域共享 ：注入自定义 CookieSerializer，serializer.setDomainName("mymall.com");
                // 2.json 序列化 session： 注入自定义 RedisSerializer
                session.setAttribute("loginUser", member);
                // Cookie cookie = new Cookie("JSESSIONID", "0");
                // cookie.setDomain(".mymall.com");
                // httpResponse.addCookie(cookie);

                // 3. 登录成功就跳会首页
                return "redirect:http://mymall.com";
            } else {
                return "redirect:http://auth.mymall.com/login.html";
            }
        } else {
            return "redirect:http://auth.mymall.com/login.html";
        }
    }
}
